package com.project_doctor.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project_doctor.mapper.RoleMapper;
import com.project_doctor.pojo.Role;
import com.project_doctor.pojo.dto.RoleDTO;
import com.project_doctor.service.RoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * 角色服务实现类
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    /**
     * 获取所有角色及其权限信息
     * @return 角色列表
     */
    @Override
    public List<RoleDTO> getRolesWithPermissions() {
        return roleMapper.selectRolesWithPermissions();
    }

    /**
     * 根据角色ID获取角色及其权限信息
     * @param roleId 角色ID
     * @return 角色信息
     */
    @Override
    public RoleDTO getRoleWithPermissionsById(Long roleId) {
        return roleMapper.selectRoleWithPermissionsById(roleId);
    }

    /**
     * 保存角色信息及其权限（新增或更新）
     * @param roleDTO 角色数据传输对象
     * @return 操作是否成功
     */
    @Override
    @Transactional
    public boolean saveRoleWithPermissions(RoleDTO roleDTO) {
        try {
            Role role = new Role();
            BeanUtils.copyProperties(roleDTO, role);

            if (role.getId() == null) {
                // 新增角色
                String roleCode = generateRoleCode(role.getName());
                role.setRoleCode(roleCode);
                role.setCreateTime(new Date());

                int result = roleMapper.insertRole(role);
                if (result > 0) {
                    roleDTO.setId(role.getId()); // 设置生成的ID
                } else {
                    return false;
                }
            } else {
                // 更新角色
                role.setUpdateTime(new Date());
                int result = roleMapper.updateRole(role);
                if (result <= 0) {
                    return false;
                }
            }

            // 更新权限关联
            if (roleDTO.getPermissionIds() != null && !roleDTO.getPermissionIds().isEmpty()) {
                updateRolePermissions(roleDTO.getId(), roleDTO.getPermissionIds());
            }

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 生成角色编码
     * @param roleName 角色名称
     * @return 角色编码
     */
    private String generateRoleCode(String roleName) {
        // 简单的编码生成规则：角色名称的拼音首字母 + 时间戳后4位
        long timestamp = System.currentTimeMillis();
        String timeStr = String.valueOf(timestamp).substring(String.valueOf(timestamp).length() - 4);

        // 这里简化处理，实际项目中可以使用拼音库
        String code = "role_" + timeStr;
        return code;
    }

    /**
     * 更新角色权限分配
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     * @return 操作是否成功
     */
    @Override
    @Transactional
    public boolean updateRolePermissions(Long roleId, List<Long> permissionIds) {
        try {
            // 删除原有权限关联
            roleMapper.deleteRolePermissions(roleId);

            // 插入新的权限关联
            if (permissionIds != null && !permissionIds.isEmpty()) {
                roleMapper.insertRolePermissions(roleId, permissionIds);
            }

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除角色及其权限关联
     * @param roleId 角色ID
     * @return 操作是否成功
     */
    @Override
    @Transactional
    public boolean deleteRoleWithPermissions(Long roleId) {
        try {
            // 删除权限关联
            roleMapper.deleteRolePermissions(roleId);

            // 删除角色
            int result = roleMapper.deleteRoleById(roleId);

            return result > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}